package modelo.elector;

import java.io.BufferedReader;
import java.io.FileReader;
import java.util.Enumeration;
import java.util.Hashtable;
import java.util.Observable;
import java.util.Vector;

public class ModeloElector extends Observable {

	private static String PRESIDENTES = "./src/main/resources/presidentes.txt";
	private static String GOBERNADORES = "./src/main/resources/gobernadores.txt";	
	
	private Hashtable<Integer, Vector> candidatos;
	private int page = 1, categoriaActual, cantCategorias;// a 1 presidentes, a
															// 2 gobernadores
	private Vector candidatosSeleccionados;
	private Vector candidatosConfirmados;
	// s
	private int MIN_CANDIDATOS = 0;
	private boolean enVotacion = false, candidatosCargados = false;

	
	public static class ModeloElectorException extends Exception{
		
		public ModeloElectorException(Exception e){
			
			super(e);
		}
	}
	
	public ModeloElector() throws ModeloElectorException{

		this.cantCategorias = 0;
		candidatos = new Hashtable();
		candidatosSeleccionados = new Vector();
		candidatosConfirmados = new Vector();

		if (!candidatosCargados) {
			int key = 1;
			try {
				// Leer archivo
				FileReader fr = new FileReader(PRESIDENTES);
				BufferedReader entrada = new BufferedReader(fr);
				String s;
				Integer i = 1;
				Vector temp = new Vector();
				while ((s = entrada.readLine()) != null) {
					String nombre = new String(s);
					s = entrada.readLine();
					String boleta = new String(s);
					Candidato aux;

					aux = new Candidato(nombre, i, boleta);// esta es la
															// variable donde
															// queda instanciada

					temp.add(aux);
					i++;
				}

				this.candidatos.put(key, temp);
				key++;
				this.cantCategorias++;
			} catch (Exception ex) {
				
				throw new ModeloElectorException(ex);
			}

			try {
				FileReader fr2 = new FileReader(GOBERNADORES);
				BufferedReader entrada2 = new BufferedReader(fr2);
				String s2;
				Integer i2 = 1;
				Vector temp = new Vector();
				while ((s2 = entrada2.readLine()) != null) {
					System.out.println(s2);
					Candidato aux2;

					aux2 = new Candidato(s2, i2, "D:/02.jpg");// esta																			// es
																			// la
																			// variable
																			// donde
																			// queda
																			// instanciada

					temp.add(aux2);
					i2++;
				}
				this.candidatos.put(key, temp);
				key++;
				this.cantCategorias++;
			} catch (Exception ex) {
				
				throw new ModeloElectorException(ex);
			}

			candidatosCargados = true;
			categoriaActual = this.candidatos.size();
            System.out.print("ddddd");
			this.setChanged();
			notifyObservers(this.candidatos);
			
			page++;

		}
	}

	public Hashtable getCandidatos(){
		return this.candidatos;
	}
	
	public void nuevaEleccion() {
		if ((candidatosCargados) && (!enVotacion)) {
			enVotacion = true;
			candidatosSeleccionados.removeAllElements();
			candidatosConfirmados.removeAllElements();
			categoriaActual = this.candidatos.size();
			/*this.setChanged();
			notifyObservers(new Boolean(true));
		*/}
	}

	

	public void cambiarEstadoCandidato(Integer idCandidato) {
		if ((enVotacion) && (candidatosCargados)) {
			// System.out.println("el erro "+((this.candidatos).get(this.categoriaActual)).size());
			if ((idCandidato > MIN_CANDIDATOS)
					&& (idCandidato <= ((this.candidatos)
							.get(this.categoriaActual)).size())) {
				idCandidato--;

				if (!candidatosSeleccionados.contains(idCandidato))// selecciona
																	// un nuevo
																	// candidato
				{
					if (candidatosSeleccionados.size() < 1)// si 2 es el maximo
															// de candidatos que
															// se pueden elejir
					{
						candidatosSeleccionados.add(idCandidato);
						this.setChanged();

						notifyObservers(idCandidato);
					}
				} 
				else// des-selecciona un candidato
				{
					candidatosSeleccionados.remove(idCandidato);
					this.setChanged();
					notifyObservers(idCandidato);
				}

			}
		}
	}

	public Vector confirmarEleccion() {
		if ((enVotacion) && (candidatosCargados)) {
			if (candidatosSeleccionados.size() == 1)// selecciono un candidato y
													// lo confirma
			{
				categoriaActual--;
				candidatosConfirmados.add(candidatosSeleccionados.get(0));
				candidatosSeleccionados.removeAllElements();
				this.setChanged();
				if (candidatosConfirmados.size() == this.cantCategorias) {
					/*
					 * ACA HAY QUE DEVOLVER UN FILE CON LA VOTACION PARA GUARDAR
					 * EN LA TARJETA
					 */

					for (int r = 0; r < candidatosConfirmados.size(); r++)
						System.out.println("mostrando "
								+ candidatosConfirmados.get(r));

					categoriaActual = this.candidatos.size();
					Enumeration e = (Enumeration) ((Hashtable) this.candidatos)
							.keys();

					Integer obj;

					int cont = 0;
					while (e.hasMoreElements()) {

						obj = (Integer) e.nextElement();

						System.out
								.println("direccImagen "
										+ ((Candidato) (((Vector) ((Hashtable) this.candidatos)
												.get(obj))
												.get((Integer) candidatosConfirmados
														.get(cont))))
												.getImagen());
						System.out
								.println("ID "
										+ ((Candidato) (((Vector) ((Hashtable) this.candidatos)
												.get(obj))
												.get((Integer) candidatosConfirmados
														.get(cont)))).getID());
						System.out
								.println("Nombre "
										+ ((Candidato) (((Vector) ((Hashtable) this.candidatos)
												.get(obj))
												.get((Integer) candidatosConfirmados
														.get(cont))))
												.getNombre());

						cont++;
					}
					candidatosConfirmados.removeAllElements();
					notifyObservers(new String("CIERRE VOTACION"));
					enVotacion = false;

				} else
					notifyObservers();

			}
		}
		return null;
	}

}
